package com.example.demo.Controller;

import com.example.demo.Dao.PersonRepository;
import com.example.demo.Dao.RecordRepository;
import com.example.demo.Entity.Person;
import com.example.demo.Entity.Record;
import com.example.demo.Qo.PersonQo;
import com.example.demo.Service.AlertService;
import com.example.demo.Utils.CodeUtils;
import com.example.demo.Utils.ConstUtils;
import com.example.demo.Utils.CosUtils;
import com.example.demo.Utils.JavaWebTokenUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Jwts;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.lang.Nullable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * WorkerController
 * 此处用来编辑工作者的api接口
 *
 * 记得将自己写的方法的详细内容写在文档中，文件命名：编辑人-模块.doc
 *
 *
 *
 * 工作者获取用户个人信息[用于用户端扫描二维码]
 * （
 *  头像URL（String），
 *  姓名 （String）,
 *  身份证 (String) 长度限制13位,
 *  地址  （String），
 *  出入次数 （Int）
 *  ）
 *
 *
 * 使用这里的方法 需要 token 中有  ROLE_WORKER权限
 * @blame 吴经纶
 */

@RestController
@RequestMapping("/api/worker")
@Api("工作者api接口")
@CrossOrigin
@Slf4j
public class WorkerController {
    @Resource
    RecordRepository recordRepository;
    @Resource
    PersonRepository personRepository;
    @Resource
    AlertService alertService;

    @ApiOperation("提供API，可记录检查人员扫描住户电子出入证后输入的住户健康状态信息，要求有WOKRER身份")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", name = "url", dataType = "String", required = true)
    })
    @ApiResponses({
            @ApiResponse(code = 404, message = "请求路径没填好")
    })
    @GetMapping("/qcode")
    public String generateQCode() {
        return "解析二维码返回json信息";
    }


    @GetMapping("/realname")
    public CodeUtils.Message getName(HttpServletRequest request){
        try {
            String token = request.getHeader(ConstUtils.TokenUtils.TOKEN_HEADERS);
            token = token.replace(ConstUtils.TokenUtils.TOKEN_PREFIX,"");
           return CodeUtils.Message.builder().code(20000).message(JavaWebTokenUtils.getUsernameFromToken(token)).build();
        }catch (Exception e)
        {
            return CodeUtils.Message.builder().code(CodeUtils.AUTH_ERROR).message("token 信息错误").build();
        }
    }
    @PostMapping("/record")
    public CodeUtils.Message setRecord(@RequestBody Record record, @RequestParam @Nullable  Integer day){
        try {


            if (day==null)
            {
                day = 7;
            }
            record = recordRepository.save(record);
            String userOpenId = record.getUserOpenId();

            Person  p  = personRepository.findByOpenId(userOpenId);

            boolean result = alertService.isUserThreeDayHighDuringDay(userOpenId,day);
            //            用户在系统中时给他设置高位警告
            if (p!=null&& result)
            {
                p.setIsHealth(false);
                log.info("触发设置健康状态");
                personRepository.save(p);
            }
            return CodeUtils.Message.builder().code(20000).message(Boolean.toString(result)).build();
        }catch (Exception e)
        {
            return CodeUtils.Message.builder().code(CodeUtils.AUTH_ERROR).message("token 信息错误").build();
        }
    }
    @GetMapping("/record")
    public CodeUtils.Message getWorkerRecord(HttpServletRequest request){
        try {
            String token  =  request.getHeader(ConstUtils.TokenUtils.TOKEN_HEADERS);
            token = token.replace(ConstUtils.TokenUtils.TOKEN_PREFIX, "");
            String userName = JavaWebTokenUtils.getUsernameFromToken(token);
            Person p = personRepository.findByUsername(userName);
            List<Record> records = recordRepository.findAllByWorkerName(p.getRealName());
            return CodeUtils.Message.builder().code(20000).message(CodeUtils.Message.encodeMessageToToString(records)).build();
        }catch (Exception e)
        {
            return CodeUtils.Message.builder().code(55044).message("服务器发生未知错误").build();
        }
    }
    @GetMapping("/recordnum")
    public CodeUtils.Message countUserRecord(HttpServletRequest request){
        try {
            String token  =  request.getHeader(ConstUtils.TokenUtils.TOKEN_HEADERS);
            token = token.replace(ConstUtils.TokenUtils.TOKEN_PREFIX, "");
            String userName = JavaWebTokenUtils.getUsernameFromToken(token);
            Person p = personRepository.findByUsername(userName);
            Integer num = recordRepository.countAllByWorkerName(p.getRealName());
            return CodeUtils.Message.builder().code(20000).message(num.toString()).build();
        }catch (Exception e)
        {
            return CodeUtils.Message.builder().code(55044).message("服务器发生未知错误").build();
        }
    }
    @GetMapping("/sevendaynum")
    public CodeUtils.Message getDayAndNumber(HttpServletRequest request)
    {
        try {
            String token  =  request.getHeader(ConstUtils.TokenUtils.TOKEN_HEADERS);
            token = token.replace(ConstUtils.TokenUtils.TOKEN_PREFIX, "");
            String userName = JavaWebTokenUtils.getUsernameFromToken(token);
            Person p = personRepository.findByUsername(userName);
            List<Integer> num = recordRepository.getDayAndNumber(p.getRealName());
            return CodeUtils.Message.builder().code(20000).message(CodeUtils.Message.encodeMessageToToString(num)).build();
        }catch (Exception e)
        {
            return CodeUtils.Message.builder().code(55044).message("服务器发生未知错误").build();
        }
    }
}
